/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.supinfo.youfood.web.servlet.client;

import com.supinfo.youfood.entity.*;
import com.supinfo.youfood.service.*;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.icepush.PushContext;

/**
 *
 * @author Michael
 */
@WebServlet(name = "AddCommandeServlet", urlPatterns = {"/AddCommande"})
public class CommandeServlet extends HttpServlet {

    @EJB
    private CommandeService commandeService;
    
    @EJB
    private MenuService menuService;
    
    @EJB
    private ProduitService produitService;
    
    @EJB
    private MessageService messageService;
    
    @EJB
    private Commande_MenuService commande_menuService;
    
    @EJB
    private Commande_ProduitService commande_produitService;
    
    @EJB
    private TableRestoService table_restoService;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Commande c = new Commande();
        String type = request.getParameter("type");
        String who = request.getParameter("who");
        
        if(type.equals("menu")) {
            Long id_menu = Long.valueOf(request.getParameter("menu_id"));
            Menu m = menuService.findMenuById(id_menu);
            Commande_Menu commandeMenu = new Commande_Menu(m, c);
            
            List<Commande_Menu> listCommande_Menu = new ArrayList<Commande_Menu>();
            List<Commande_Menu> listCommande_MenuInSession = new ArrayList<Commande_Menu>();
            
            listCommande_MenuInSession = (List<Commande_Menu>)request.getSession(true).getAttribute("listCommande_Menu");
            
            if(listCommande_MenuInSession != null) {
                if(!listCommande_MenuInSession.isEmpty()) {
                    listCommande_MenuInSession.add(commandeMenu);
                    request.getSession(true).setAttribute("listCommande_Menu", listCommande_MenuInSession);
                }
                else {
                    listCommande_Menu.add(commandeMenu);
                    request.getSession(true).setAttribute("listCommande_Menu", listCommande_Menu);
                }
            }
            else {
                listCommande_Menu.add(commandeMenu);
                request.getSession(true).setAttribute("listCommande_Menu", listCommande_Menu);
            }
        }
        else if (type.equals("produit")){
            Long id_produit = Long.valueOf(request.getParameter("id_produit"));
            Produit p = produitService.findProduitById(id_produit);
            Commande_Produit commandeProduit = new Commande_Produit(p, c);
            
            List<Commande_Produit> listCommande_Produit = new ArrayList<Commande_Produit>();
            List<Commande_Produit> listCommande_ProduitInSession = new ArrayList<Commande_Produit>();
            
            listCommande_ProduitInSession = (List<Commande_Produit>)request.getSession(true).getAttribute("listCommande_Produit");
            
            if(listCommande_ProduitInSession != null) {
                if(!listCommande_ProduitInSession.isEmpty()) {
                    listCommande_ProduitInSession.add(commandeProduit);
                    request.getSession(true).setAttribute("listCommande_Produit", listCommande_ProduitInSession);
                }
                else {
                    listCommande_Produit.add(commandeProduit);
                    request.getSession(true).setAttribute("listCommande_Produit", listCommande_Produit);
                }
            }
            else {
                listCommande_Produit.add(commandeProduit);
                request.getSession(true).setAttribute("listCommande_Produit", listCommande_Produit);
            }
        }
        
        //Redirection sur la page courante
        if(who.equals("client")) {
            //Mise en session
            request.getSession(true).setAttribute("currentCommande", c);
            response.sendRedirect("accueil");
        }
            
        else if(who.equals("serveur")) {
            //Mise en session
            c.setServeur((Employe)request.getSession(true).getAttribute("currentEmp"));
            request.getSession(true).setAttribute("currentCommande", c);
            response.sendRedirect("serveur/SaisieCommande");
        }
            
    }

    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        if(this.validateOrder(request, response)) {
            this.pushCurrentCommande(request, response);
            request.getSession(true).setAttribute("succesOrder", true);
        }
        
        //Redirection sur la page courante
        response.sendRedirect("accueil");
    }
    
    protected boolean validateOrder(HttpServletRequest request, HttpServletResponse response) {
        
        /**
         * Validation de la commande courante
         */
        Commande currentCommande = (Commande)request.getSession(true).getAttribute("currentCommande");
        Date dateCommande = Calendar.getInstance().getTime();
        DateFormat dtf = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
        String libelle = "Commande du "+dtf.format(dateCommande);
        currentCommande.setDate_commande(dateCommande);
        currentCommande.setLibelle(libelle);
        currentCommande.setTableResto((TableResto)request.getSession(true).getAttribute("currentTable"));
        commandeService.addCommand(currentCommande);
        
        // Enregistrement des "lignes de commandes" : produits & menus
        List<Commande_Produit> commande_produit = (List<Commande_Produit>)request.getSession(true).getAttribute("listCommande_Produit");
        List<Commande_Menu> commande_menu = (List<Commande_Menu>)request.getSession(true).getAttribute("listCommande_Menu");
        double totalMenu = 0;
        double totalProduit = 0;
        
        List<Commande_Produit> commandeProduits = new ArrayList();
        if(commande_produit != null) {
            for(int i=0;i<commande_produit.size();i++) {
                Commande c = commandeService.findCommandeById(currentCommande.getId_commande());
                Produit p = commande_produit.get(i).getProduit();
                //Calcul du prix
                double prixProduit = p.getPrixHT();
                totalProduit = totalProduit+prixProduit;
                //enregistrement
                Commande_Produit commandeProduit = commande_produitService.addCommandeProduit(c,p);
                commandeProduits.add(commandeProduit);
            }
        }
        
        List<Commande_Menu> commandeMenus = new ArrayList();
        if(commande_menu != null) {
            for(int i=0;i<commande_menu.size();i++) {
                Commande c = commandeService.findCommandeById(currentCommande.getId_commande());
                Menu m = commande_menu.get(i).getMenu();
                double prixMenu = m.getPrix();
                totalMenu = totalMenu+prixMenu;
                //enregistrement
                Commande_Menu commandeMenu = commande_menuService.addCommandeMenu(m, c);
                commandeMenus.add(commandeMenu);
            }
        }
        
        currentCommande.setList_menus(commandeMenus);
        currentCommande.setList_produits(commandeProduits);
        commandeService.updateCommande(currentCommande);
        
        TableResto table = (TableResto)request.getSession(true).getAttribute("currentTable");
        table.addCommande(currentCommande);
        table_restoService.updateTableResto(table);
        
        //Calcul du montant de la la commande
        double montantTotal = totalMenu+totalProduit;
        request.getSession(true).setAttribute("montant", montantTotal);
        
        if(currentCommande.getId_commande() != null) {
            //Envoi de la commande à la cuisine
            try {
                String id_currentCommande = String.valueOf(currentCommande.getId_commande());
                messageService.sendKitchenMessage(id_currentCommande);
            } catch (NamingException ex) {
                System.out.println(ex.getMessage());
            }
            return true;
        }
        else 
            return false;
    }
    
    protected void pushCurrentCommande(HttpServletRequest request, HttpServletResponse response) {
        Commande currentCommande = (Commande)request.getSession(true).getAttribute("currentCommande");
        Commande c = commandeService.findCommandeById(currentCommande.getId_commande());
        request.getSession(true).setAttribute("currentC", c);
        
        PushContext pushContext = PushContext.getInstance(request.getServletContext());
        pushContext.push(String.valueOf(c.getId_commande()));
    }
}
